/**  
* each是一个集合迭代函数，它接受一个函数作为参数和一组可选的参数  
* 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算，并将计算得的结果集返回  
{%example  
<script>  
     var a = [1,2,3,4].each(function(x){return x > 2 ? x : null});  
     var b = [1,2,3,4].each(function(x){return x < 0 ? x : null});  
     alert(a);  
     alert(b);  
</script>  
%}  
* @param {Function} fn 进行迭代判定的函数  
* @param more ... 零个或多个可选的用户自定义参数  
* @returns {Array} 结果集，如果没有结果，返回空集  
*/  
Array.prototype.each = function(fn){  
    fn = fn || Function.K;  
     var a = [];  
     var args = Array.prototype.slice.call(arguments, 1);  
     for(var i = 0; i < this.length; i++){  
         var res = fn.apply(this,[this[i],i].concat(args));  
         if(res != null) a.push(res);  
     }  
     return a;  
};  
  
/**  
* 得到一个数组不重复的元素集合<br/>  
* 唯一化一个数组  
* @returns {Array} 由不重复元素构成的数组  
*/  
Array.prototype.uniquelize = function(){  
     var ra = new Array();  
     for(var i = 0; i < this.length; i ++){  
         if(!ra.contains(this[i])){  
            ra.push(this[i]);  
         }  
     }  
     return ra;  
};  

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}


/**  
* 求两个集合的补集  
{%example  
<script>  
     var a = [1,2,3,4];  
     var b = [3,4,5,6];  
     alert(Array.complement(a,b));  
</script>  
%}  
* @param {Array} a 集合A  
* @param {Array} b 集合B  
* @returns {Array} 两个集合的补集  
*/  
Array.complement = function(a, b){  
     return Array.minus(Array.union(a, b),Array.intersect(a, b));  
};  
  
/**  
* 求两个集合的交集  
{%example  
<script>  
     var a = [1,2,3,4];  
     var b = [3,4,5,6];  
     alert(Array.intersect(a,b));  
</script>  
%}  
* @param {Array} a 集合A  
* @param {Array} b 集合B  
* @returns {Array} 两个集合的交集  
*/  
Array.intersect = function(a, b){  
     return a.uniquelize().each(function(o){return b.contains(o) ? o : null});  
};  
  
/**  
* 求两个集合的差集  
{%example  
<script>  
     var a = [1,2,3,4];  
     var b = [3,4,5,6];  
     alert(Array.minus(a,b));  
</script>  
%}  
* @param {Array} a 集合A  
* @param {Array} b 集合B  
* @returns {Array} 两个集合的差集  
*/  
Array.minus = function(a, b){  
     return a.uniquelize().each(function(o){return b.contains(o) ? null : o});  
};  
  
/**  
* 求两个集合的并集  
{%example  
<script>  
     var a = [1,2,3,4];  
     var b = [3,4,5,6];  
     alert(Array.union(a,b));  
</script>  
%}  
* @param {Array} a 集合A  
* @param {Array} b 集合B  
* @returns {Array} 两个集合的并集  
*/  
Array.union = function(a, b){  
     return a.concat(b).uniquelize();  
};

Array.isArray = function(v){
    return toString.apply(v) === '[object Array]';
}

Array.prototype.toString = function () {
    return "["+this.join(",")+"]";
}


// $.fn.ownText = function () {
//     return $(this).contents().map(function () {
//         return this.nodeType == 3 && $.trim(this.nodeValue) ? $.trim(this.nodeValue) : undefined;
//     }).get().join(' ');
// }

/**
 * 对日期进行格式化，
 * @param date 要格式化的日期
 * @param format 进行格式化的模式字符串
 *     支持的模式字母有：
 *     y:年,
 *     M:年中的月份(1-12),
 *     d:月份中的天(1-31),
 *     h:小时(0-23),
 *     m:分(0-59),
 *     s:秒(0-59),
 *     S:毫秒(0-999),
 *     q:季度(1-4)
 * @return String
 * @author yanis.wang
 * @see	http://yaniswang.com/frontend/2013/02/16/dateformat-performance/
 */
// template.helper('dateFormat', function (date, format) {
//     if(!date){
//         return "";
//     }
//     date = new Date(date);

//     var map = {
//         "M": date.getMonth() + 1, //月份
//         "d": date.getDate(), //日
//         "h": date.getHours(), //小时
//         "m": date.getMinutes(), //分
//         "s": date.getSeconds(), //秒
//         "q": Math.floor((date.getMonth() + 3) / 3), //季度
//         "S": date.getMilliseconds() //毫秒
//     };
//     format = format.replace(/([yMdhmsqS])+/g, function(all, t){
//         var v = map[t];
//         if(v !== undefined){
//             if(all.length > 1){
//                 v = '0' + v;
//                 v = v.substr(v.length-2);
//             }
//             return v;
//         }
//         else if(t === 'y'){
//             return (date.getFullYear() + '').substr(4 - all.length);
//         }
//         return all;
//     });
//     return format;
// });

// template.helper('elecFormat',function (ele) {
//     if (!ele) {
//         return "";
//     }
//     ele = parseFloat(ele, 10);
//     if (ele >= 0 && ele <= 1) {
//         return parseInt(ele * 100 + 0.5, 10) + "%";
//     } else if (ele <= 3.4) {
//         return "0%";
//     } else if (ele >= 4.17) {
//         return "100%";
//     } else {
//         return parseInt((ele - 3.4) / 0.77 * 100 + 0.5, 10) + "%";
//     }
// });
